/**
 * PLUGIN Object
 * 
 * @author Javier Pérez <javier@javierperez.eu>
 * @license GPL
 * @version 1.0
 */
var RF_PLUGIN = {
	
	/**
	 * google: crea un plugin para buscar en google
	 * 
	 * @author Javier Pérez
	 * @license GPL
	 * @version 1.0
	 * 
	 * @param String title Título del plugin
	 * @param String home Web principal de donde se busca
	 * @param String icon Favicon de la web
	 * @param String site Dominio en el cual Google debe buscar 
	 */
	google: function(title,home,icon,site) {
		return {
			title: title ? title : 'Google',
			home: home ? home : 'http://www.google.es/',
			icon: icon ? icon : 'http://www.google.es/favicon.ico',
			location: 'http://www.google.es/search',
			query: 'q=' + (site ? ('site%3A'+site+'+') : '') + '{WORD}&start=0&ie=utf-8&oe=utf-8',
			method: 'get',
			driver: function(o,doc) {
				// Array de gotas
				var drops = [];
				
				/*
				// Se obtienen los <P> con clase "g"
				var l = RF_DOM.classeds(o,'p','g');
				// Se obtienen los <TD> con clase "j" (descripciones)
				var ltds = RF_DOM.classeds(o,'td','j');
				// Se procesa		
				for (var i=0; i<l.length; i++)
				{
					// Se obtiene enlace y título
					var a = l[i].getElementsByTagName('a')[0];
					var _url = a.href;
					var _html = "<a href='"+a.href+"'>"+a.innerHTML+"</a>";
					// Texto descriptivo
					var d = ltds[i].firstChild;
					var _desc = RF_DOM.create({tag:'div'});
					// Se obtiene contenido hasta BR o FONT
					for (var foo=0; foo<d.childNodes.length && d.childNodes[foo].tagName!='BR' && d.childNodes[foo].tagName!='FONT'; foo++) {
						_desc.appendChild(d.childNodes[foo]);
					}
					_desc = _desc.innerHTML;
					_html += "<br />" + _desc;
					// Se añade una nueva gota
					drops.push({
						href:_url,
						html:_html
					});
				}
				*/
				
				// Se buscan los li.g
				var lis = RF_DOM.classeds(o, 'li', 'g');
				for (var i=0; i<lis.length; i++) {
					// Eliminamos el cite
					var cite = RF_DOM.classeds(lis[i], 'cite', '')[0];
					if (cite) cite.innerHTML='';
					// Eliminamos enlaces de "cache" y "similares", span.gl
					var spangl = RF_DOM.classeds(lis[i], 'span', 'gl')[0];
					if (spangl) spangl.innerHTML='';
					// Se obtiene el enlace a.l
					var link = RF_DOM.classeds(lis[i], 'a', 'l')[0];
					if (link) {
						// Añadimos la gota
						drops.push({
							href:	link.href,
							html:	lis[i].innerHTML
						});
					}
				}
				
				// Se devuelven las gotas
				return drops;
			}
		};
	},
	
	getPluginFileURI: function(fileName) {
		return Components.classes["@mozilla.org/network/io-service;1"]
			.getService(Components.interfaces.nsIIOService)
			.newFileURI(RF_IO.getPluginFile(fileName));
	},
	
	// ---
	/**
	 * @author GreaseMonkey
	 * @param String sourceUri
	 */
	parsePluginName: function(sourceUri) {
		var name = sourceUri.spec;
		name = name.substring(0, name.indexOf(".rainfox.js"));
		name = name.substring(name.lastIndexOf("/") + 1);
		return name;
	},

	installFromUrl: function(url) {
		var u = url;
		RF_AJAX.request({
			url: url,
			onload: function(a) {
				//alert('plugin obtenido!');
				RF_PLUGIN.install(a.responseText, u);
			}
		});
	},

	/**
	 * Instala un plugin RainFox
	 * 
	 * @author GreaseMonkey
	 * @param String source Texto con el contenido del plugin
	 * @param String url Url al plugin
	 */
	install: function(source, url) {
		var ioservice = Components.classes["@mozilla.org/network/io-service;1"]
			.getService();
		var sourceUri = ioservice.newURI(url, null, null);
		
		//try {
			// Se obtiene un nombre de fichero temporal
			var targetFile = RF_IO.getTempFile();
			// Se abre el fichero temporal para escritura
			var writeStream = RF_IO.getWriteStream(targetFile);
			// Se escribe el plugin en el fichero temporal
			writeStream.write(source, source.length);
			writeStream.close();
			
			// Se inicializa un nuevo objeto PluginInfo
			var plugin = new PluginInfo();
			plugin.url = url;
			plugin.filename = targetFile.leafName;
    
			// Se lee cada linea buscando información meta
			var lines = source.match(/.+/g);
			var lnIdx = 0;
			var result = {};
			var foundMeta = false;
			while (result = lines[lnIdx++]) {
				if (result.indexOf("/**") == 0) {
					foundMeta = true;
					break;
				}
			}

			// Si se encontró contenido meta, se lee
			if (foundMeta) {
				while (result = lines[lnIdx++]) {
					if (result.indexOf(" */") == 0) {
						// Fin de contenido meta
						break;
					}
					// Se obtienen todos los parámetros
					var match = result.match(/ \* \@(\S+)\s+([^\n]+)/);
					if (match != null) {
						switch (match[1]) {
							case "author":
							case "name":
							case "namespace":
							case "description":
							case "license":
							case "version":
								plugin[match[1]] = match[2];
								break;
						}
					}
				}
			}

			// if no meta info, default to reasonable values
			if (plugin.name == null)
				plugin.name = RF_PLUGIN.parsePluginName(sourceUri);
			if (plugin.namespace == null)
				plugin.namespace = sourceUri.host;
			
			// Se obtiene la configuración
			var config = new RFConfig(RF_IO.getPluginFile("config.xml"));
			config.load();

			var newDir = RF_IO.getPluginDir();
			var existingIndex = config.find(plugin.namespace, plugin.name);
			var existingFile = null;
			var oldPlugins = new Array(config.plugins);

			// Si existe el plugin, se elimina
			if (existingIndex > -1) {
				existingFile = RF_IO.getPluginFile(config.plugins[existingIndex].filename);
				existingFile.remove(false);
				config.plugins.splice(existingIndex, 1);
			}

			// Se guarda el plugin en el directorio de plugins
			try {
				config.initFilename(plugin);
				// Se mueve el fichero temporal a su hubicación normal
				targetFile.moveTo(newDir, plugin.filename)
				// Se añade el nuevo plugin al fichero de configuración
				config.plugins.push(plugin);
				// Se guarda el fichero de configuración
				config.save();
				//GM_BrowserUI.hideStatus();
				// TODO: internacionalizar
				alert(plugin.filename + " instalado correctamente.");
			} catch (e) {
				config.plugins = oldPlugins;
				throw e;
			}
		//} catch (e2) {
		//	alert("Error instalando el plugin para RainFox:\n\n" + (e2 ? e2 : ""));
			//GM_BrowserUI.hideStatus();
		//}
	},
	// --- END INSTALL ---

	/**
	 * Indica si el enlace apuntado es un plugin RainFox
	 * @author GreaseMonkey
	 */
	getPluginLinkUnderPointer: function() {
		var contextItem = $("install-rf-plugin");
		var contextSep = $("install-rf-plugin-sep");
		
		var culprit = document.popupNode;
		while (culprit && culprit.tagName && culprit.tagName.toLowerCase() != "a") {
			culprit = culprit.parentNode;
		}

		//alert(culprit);
		if (culprit && culprit.href && culprit.href.match(/\.rainfox\.js(\?|$)/i) != null) {
			return culprit;
		} else {
			return null;
		}
	},
	
	/**
	 * Greasemonkey's enabled state has changed, either as a result of clicking
	 * the icon in this window, clicking it in another window, or even changing
	 * the mozilla preference that backs it directly.
	 * @author GreaseMonkey
	 */
	refreshStatus: function() {
		//alert('refresh status');
		if (RF_PLUGIN.enabled()) {
			DOM_statusImage.src = "chrome://rainfox/skin/rainfox_on.png";
			DOM_statusImage.tooltipText = DOM_bundle.getString('tooltip.enabled');
		} else {
			DOM_statusImage.src = "chrome://rainfox/skin/rainfox_off.png";
			DOM_statusImage.tooltipText = DOM_bundle.getString('tooltip.disabled');
		}
	},
	
	/**
	 * Indica si RainFox está activo o no
	 */
	enabled: function() {
		return RF_PREFS.get("enabled", true);
	},
	setEnabled: function(enabled) {
		RF_PREFS.set("enabled", enabled);
		//alert(RF_PLUGIN.enabled());
	},
	
}
